#ifndef _TSNINSIGHT_H__
#define _TSNINSIGHT_H__

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>/*memcpy*/
#include <strings.h>/*bzero*/

#include <unistd.h>
#include <errno.h>

#include <arpa/inet.h>/*htons,ntohs*/

#include <endian.h>/*htobeXX,beXXtoh,htoleXX,leXXtoh*/
#include <sys/types.h>
#include <sys/socket.h>

#include <linux/if_ether.h>/*struct ethhdr*/
#include <linux/ip.h>/*struct iphdr*/
#include <sys/ioctl.h>
#include <net/if.h>
#include <netpacket/packet.h>




#define TSNINSIGHT_PORT 9099

//#define SERVER_IP 	"192.168.1.102"

#define UDP_HEAD_LEN 	42
#define TSNINSIGHT_VERSION 	0x01

#define CONFIG_FILE "lib.cfg"


//文本最多1024行
#define MAX_LINES 1024

//文本每行最大256字节
#define LINE_LEN  256

#define LINE(x)   file.lines[x].line
#define LINE_CNT  file.line_cnt




//读写文本相关结构体
struct one_line {
	char line[LINE_LEN];
	int char_cnt;
};

//读写文本相关结构体
struct file_content {
	struct one_line lines[MAX_LINES];
	int line_cnt;
};





/*与TSNInsight通信的通用报文头部*/
typedef struct
{
	unsigned char version; 		/* 版本号，目前值为0x01 */
	unsigned char type; 			/* 报文类型，hello、set_req、set_res和Trap*/
	unsigned short length; 		/* 通用报文长度，不包含以太网头、IP头和UDP头*/
}__attribute__((packed))tsninsight_header;

/*报文结构*/
typedef struct
{
	tsninsight_header header;      /* 通用报文头部 */
	unsigned char data[0];            /* 报文数据 */
}__attribute__((packed))tsninsight_pkt;



/*hello报文数据结构定义*/
typedef struct
{
	tsninsight_header header;      /* 通用报文头部 */
	unsigned short mid;            /* Opensync软件的mid */
	unsigned char role;            /* 角色*/
	unsigned char pad;            /* 保留位 */
}__attribute__((packed))tsninsight_hello_pkt;


/*get_req报文数据结构定义*/
typedef struct
{
	tsninsight_header header;      /* 通用报文头部 */
	unsigned short mid;            /* 查询设备mid */
    unsigned short num;            /* 数目 */
	unsigned int base_addr;            /* 基地址 */
}__attribute__((packed))tsninsight_get_req_pkt;

/*设置设备参数类型的set_req报文数据结构定义*/
typedef struct
{
	tsninsight_header header;      /* 通用报文头部 */
	unsigned char set_type;            /* 设置类型 */
	unsigned char pad[3];            /* 保留 */
	unsigned short mid;            /* 查询设备mid */
    unsigned short num;            /* 数目 */
	unsigned int base_addr;            /* 基地址 */
	unsigned int value[0];       /* 请求设置寄存器的值 */
}__attribute__((packed))tsninsight_set_device_req_pkt;



/*get_res报文数据结构定义*/
typedef struct
{
	tsninsight_header header;      /* 通用报文头部 */
	unsigned short mid;            /* 查询设备mid */
    unsigned short num;            /* 数目 */
	unsigned int base_addr;            /* 基地址 */
	unsigned int value[0];       /* 查询响应数值 */
}__attribute__((packed))tsninsight_get_res_pkt;


/*设置设备参数类型的set_res报文数据结构定义*/
typedef struct
{
	tsninsight_header header;      /* 通用报文头部 */
	unsigned char set_type;            /* 设置类型 */
	unsigned char pad[3];            /* 保留 */
	unsigned short mid;            /* 查询设备mid */
    unsigned short num;            /* 数目 */
	unsigned int base_addr;            /* 基地址 */
}__attribute__((packed))tsninsight_set_device_res_pkt;



/*节点版本号信息数据结构定义*/
typedef struct
{
	unsigned short mid;            /* 节点mid */
	unsigned int version;            /* 版本号 */
}__attribute__((packed))node_version;


/*版本号子类型的trap报文数据结构定义*/
typedef struct
{
	tsninsight_header header;      /* 通用报文头部 */
	unsigned char trap_type;            /* trap类型 */
	unsigned char num;            /* 节点数目 */
	node_version data[0];            /* 节点版本信息 */
}__attribute__((packed))tsninsight_version_trap_pkt;


/*节点离线错误子类型的trap报文数据结构定义*/
typedef struct
{
	tsninsight_header header;      /* 通用报文头部 */
	unsigned char trap_type;            /* trap类型 */
	unsigned char sweep_error_type;            /* 错误类型 */
	unsigned short mid;            /* 设备节点离线的mid */
}__attribute__((packed))tsninsight_sweep_trap_pkt;



/*设置时间同步精度显示或扫描周期报文数据结构定义*/
typedef struct
{
	tsninsight_header header;      /* 通用报文头部 */
	unsigned char set_type;            /* 设置类型 */
	unsigned short offset_report_cycle;            /* 上报周期，单位ms */
	unsigned char pad;            /* 保留 */
}__attribute__((packed))tsninsight_set_cycle_pkt;



/*网络状态子类型的trap报文数据结构定义*/
typedef struct
{
	tsninsight_header header;      /* 通用报文头部 */
	unsigned char trap_type;            /* trap类型 */
	unsigned char state;            /* 网络状态 */
	unsigned short pad;            /* 保留 */
}__attribute__((packed))tsninsight_netstate_trap_pkt;


/*节点时间同步精度数据结构定义*/
typedef struct
{
	unsigned short mid;            /* 节点mid */
	unsigned int offset;            /* 同步精度offset值 */
}__attribute__((packed))node_sync_offset;

/*时间同步精度子类型的trap报文数据结构定义*/
typedef struct
{
	tsninsight_header header;      /* 通用报文头部 */
	unsigned char trap_type;            /* trap类型 */
	unsigned char num;            /* 上报的节点数目 */
	node_sync_offset data[0];            /* 节点时间同步精度信息 */
}__attribute__((packed))tsninsight_sync_offset_trap_pkt;


typedef enum 
{
	TSNINSIGHT_HELLO	= 0x01,    //握手请求
	TSNINSIGHT_GET_REQ = 0x02,    //查询请求
	TSNINSIGHT_SET_REQ = 0x03, 	 //设置请求
	TSNINSIGHT_GET_RES = 0x04,   //查询响应
	TSNINSIGHT_SET_RES = 0x05,   //设置响应
	TSNINSIGHT_TRAP = 0x06,   //主动上报
}TSNINSIGHT_TYPE;


//角色定义
typedef enum 
{
	TSNLIGHT = 0x01,      //TSNLight软件
    GM = 0x02,      //包含有GM（主时钟）节点的OpenSYNC软件
    OTHER = 0x03,   //其他的OpenSYNC软件
}TSNINSIGHT_ROLE_TYPE;

//set_req和set_res类型的取值定义
typedef enum 
{	
	DEVICE_PARA  = 0x01,	//设备参数
	SWEEP_PARA = 0x02,	  //扫描参数
    SYNC_PARA = 0x03,    //时间同步精度显示周期
}TSNINSIGHT_SET_TYPE;

//网络状态的取值定义
typedef enum 
{
	NET_INIT  = 0x01,	//网络初始化
	BASE_CFG = 0x02,	 //基础配置状态
	LOCAL_PLAN_CFG = 0x03,    //本地规划配置状态
	SYNC_FINISH  = 0x04,	//同步完成状态
	NET_RUN = 0x05,    //网络运行状态
}TSNINSIGHT_NETWORK_STATE;



typedef enum 
{
	NETWORK_STATE	= 0x01,    //网络状态
	DEVICE_VESION = 0x02,	 //设备版本号
	SWEEP_STATE = 0x03,    //扫描状态
    SYNC_OFFSET = 0x04,    //同步精度
}TSNINSIGHT_TRAP_TYPE;

typedef enum 
{
 	DEVICE_OFFLINE  = 0x01,    //设备离线
}TSNINSIGHT_SWEEP_ERROR_TYPE;


int tsninsight_get_cfgx_file(const char *filpath, const char *nam, char *val);

//TSNInsight初始化函数
int tsninsight_init();
 int tsninsight_destroy();

//发送hello报文函数
int tsninsight_send_hello_pkt(unsigned short mid,unsigned char role);


 //发送网络或同步状态trap报文函数
 int tsninsight_send_netstate_trap_pkt(unsigned char type,unsigned char state);

int tsninsight_send_set_res_pkt(unsigned char *pkt,unsigned char type);

 //发送版本信息trap报文函数
int tsninsight_send_version_trap_pkt(unsigned char num,node_version* ver);

int tsninsight_pkt_process(unsigned char *pkt,unsigned short pkt_len);

#endif


